﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;

namespace Data.AID
{
    [Serializable]
    public class Meta
    {
        public int Id { get; set; }
        public string Titulo { get; set; }
        public string FerramentaMedicao { get; set; }
        public int Peso { get; set; }
        public string Aprovacao { get; set; }
        public Boolean Rejeicao { get; set; }
        public Boolean Ativo { get; set; }
        public Boolean ConsideracaoFeita { get; set; }
        public int IdFormulario { get; set; }
        public string Criado { get; set; }
        public string CriadoPor { get; set; }
        public string Modificado { get; set; }
        public string ModificadoPor { get; set; }
        public Boolean PesoAlterado { get; set; }
    }

    public class MetaDAO
    {
        private string ListaMeta
        {
            get { return "Meta"; }
        }

        private SPSite Site = SPContext.Current.Site;
        private SPWeb Web = SPContext.Current.Web;

        public List<Meta> GetAllGoals()
        {
            try
            {
                using (SPSite eSite = new SPSite(Site.ID))
                {
                    using (SPWeb eWeb = eSite.OpenWeb(Web.ID))
                    {
                        return eWeb.Lists[ListaMeta].Items.Cast<SPListItem>()
                            .Select(p => new Meta()
                            {
                                Id = Convert.ToInt32(p["ID"]),
                                Titulo = p["Descrição"] == null ? "(Sem descrição)" : p["Descrição"].ToString(),
                                FerramentaMedicao = p["FerramentaMedicao"] == null ? "(Sem ferramenta)" : p["FerramentaMedicao"].ToString(),
                                Peso = p["Peso"] == null ? 0 : Convert.ToInt32(p["Peso"]),
                                Ativo = Convert.ToBoolean(p["Status"]),
                                Criado = Convert.ToDateTime(p["Criado"]).ToShortDateString(),
                                CriadoPor = p["Criado por"].ToString(),
                                Modificado = Convert.ToDateTime(p["Modificado"]).ToShortDateString(),
                                ModificadoPor = p["Modificado por"].ToString(),
                                Aprovacao = p["Aprovacao"].ToString(),
                                ConsideracaoFeita = (p["ConsideracaoFeita"] == null) ? false : Convert.ToBoolean(p["ConsideracaoFeita"]),
                                PesoAlterado = p["PesoAlterado"] != null ? Convert.ToBoolean(p["PesoAlterado"]) : false,
                                IdFormulario = new SPFieldLookupValue(p["IdFormulario"].ToString()).LookupId
                            }).ToList();
                    }
                }
            }
            catch (Exception e)
            {
                throw (e);
            }
        }
        public List<Meta> GetAllGoalsByUser(string loginUsuario)
        {
            try
            {
                return GetAllGoals().Where(p => p.CriadoPor == loginUsuario).ToList();
            }
            catch (Exception e)
            {
                throw (e);
            }
        }
        public List<Meta> GetAllGoalsByForm(int idForm)
        {
            return GetAllGoals().Where(p => p.IdFormulario == idForm).ToList();
        }
        public Meta GetGoalById(int idGoal)
        {
            return GetAllGoals().Where(p => p.Id == idGoal).SingleOrDefault();
        }
        public void DeleteGoal(int idGoal)
        {
            try
            {
                using (SPSite eSite = new SPSite(Site.ID))
                {
                    using (SPWeb eWeb = eSite.OpenWeb(Web.ID))
                    {
                        SPListItemCollection listItems = eWeb.Lists[ListaMeta].Items;
                        listItems.DeleteItemById(idGoal);
                    }
                }
            }
            catch (Exception e)
            {
                throw (e);
            }
        }
        public void CleanApproval(Meta goal)
        {
            using (SPSite eSite = new SPSite(Site.ID))
            {
                using (SPWeb eWeb = eSite.OpenWeb(Web.ID))
                {
                    eWeb.AllowUnsafeUpdates = true;
                    SPList Lista = eWeb.Lists[ListaMeta];
                    int idmeta = goal.Id;
                    SPListItem item = Lista.GetItemById(goal.Id);
                    item["Aprovacao"] = goal.Aprovacao;
                    item["Rejeicao"] = goal.Rejeicao;
                    item.Update();
                    eWeb.AllowUnsafeUpdates = false;
                }
            }
        }
        public void SetAprovacaoMeta(Meta goal)
        {
            using (SPSite eSite = new SPSite(Site.ID))
            {
                using (SPWeb eWeb = eSite.OpenWeb(Web.ID))
                {
                    eWeb.AllowUnsafeUpdates = true;
                    SPList Lista = eWeb.Lists[ListaMeta];
                    SPListItem item = Lista.GetItemById(goal.Id);

                    item["Aprovacao"] = goal.Aprovacao;
                    item["ConsideracaoFeita"] = goal.ConsideracaoFeita;
                    item["PesoAlterado"] = goal.PesoAlterado;

                    item.Update();
                    eWeb.AllowUnsafeUpdates = false;
                }
            }
        }
        public void SetConsideration(Meta goal)
        {
            using (SPSite eSite = new SPSite(Site.ID))
            {
                using (SPWeb eWeb = eSite.OpenWeb(Web.ID))
                {
                    eWeb.AllowUnsafeUpdates = true;
                    SPList Lista = eWeb.Lists[ListaMeta];
                    SPListItem item = Lista.GetItemById(goal.Id);
                    item["ConsideracaoFeita"] = goal.ConsideracaoFeita;
                    item.Update();
                    eWeb.AllowUnsafeUpdates = false;
                }
            }
        }

        public void EditMeta(Meta meta) 
        {
            using (SPSite eSite = new SPSite(Site.ID))
            {
                using (SPWeb eWeb = eSite.OpenWeb(Web.ID))
                {
                    SPList Formulario = eWeb.Lists["Meta"];
                    SPListItem item = Formulario.GetItemById(meta.Id);

                    item["Descrição"] = meta.Titulo;
                    item["FerramentaMedicao"] = meta.FerramentaMedicao;
                    item["Peso"] = meta.Peso;
                    item["PesoAlterado"] = meta.PesoAlterado;

                    item.Update();
                }
            }
        }
    }
}